#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string>
class Solution {
public:
	int myAtoi(string str)
	{
		bool sign = true;   //默认为正数

	  // 跳过开头可能存在的空格
		int i = 0;
		while (i < str.size() && str[i] == ' ')
		{
			i++;
		}

		//接着判断首个字符是否为正负号
		if (str[i] == '-')
		{
			sign = false;  // 该字符串为负数，移至下一个字符接着判断
			i++;
		}
		else if (str[i] == '+')  // 字符串为正数，sign已经默认为true，直接移动到下一位即可
			i++;

		//下面开始对非正负符号位进行判断
		if (str[i] < '0' || str[i] > '9') // 正常数字第一位不能是0，必须为1~9之间的数字，否则就是非法数字
			return 0;

		int res = 0;   //这里res用的int型，需要更加仔细考虑边界情况，但如果用long的话可以省去一些麻烦
		int num = 0;
		int border = INT_MAX / 10;  // 用来验证计算结果是否溢出int范围的数据
		while (i < str.size())
		{
			// 遇到非数字字符，则返回已经计算的res结果
			if (str[i] < '0' || str[i] > '9')
				break;

			// 注意这句话要放在字符转换前，因为需要验证的位数比实际值的位数要少一位, 这里比较巧妙的地方在于
			// 1. 用低于int型数据长度一位的数据border判断了超过int型数据长度的值 
			// 2. 将超过最大值和低于最小值的情况都包括了
			if (res > border || res == border && str[i] > '7')
				return sign == true ? INT_MAX : INT_MIN;

			//开始对数字字符进行转换
			num = str[i] - '0';
			res = res * 10 + num;
			i++;
		}

		//最后结果根据符号添加正负号
		return sign == true ? res : -res;
	}
};